Normalmente cuando un usuario de un sistema realiza una operación, esta se compone internamente de múltiples sub operaciones que se perciben como un todo. Con esto en mente, describimos una transacción como un conjunto de operaciones que forman una unidad lógica de trabajo.
Ejemplo: Transferencia de fondos entre dos cuentas bancarias.
Transferir
€ desde una cuenta hacia una cuenta Esta operación tiene varias asociadas:
Comprobar que en A hay fondos suficientes.
Restar X del balance de A.
Sumar X al balance de B.

Al estar compuesta por diferentes sub operaciones, puede suceder que un error en cualquiera de ellas, ocasione que la transacción no finalice. En este caso, el sistema gestor de base de datos debe devolver a la base de datos al estado anterior en el que se encontraba antes de iniciar la transacción.
Para que la base de datos mantenga su integridad al ejecutar transacciones, se deben cumplir las siguientes propiedades:
Atomicity (Atomicidad): Todas las operaciones que forman parte de la transacción se tienen que ejecutar correctamente o en caso contrario no se ejecuta ninguna.
Consistency (Consistencia): Si una transacción se ejecuta de forma aislada, debe conservar la consistencia (que los datos sean correctos) de la base de datos. (No violar restricciones, siempre entre estados válidos).
Isolate (Aislamiento): En sistemas concurrentes los efectos de una transacción no deben afectar a la ejecución de otras.
Durability (Durabilidad): Cuando finaliza una transacción, los cambios en la base de datos son permanentes.
Los estados en los que puede estar una transacción son:
| Activa: es el estado inicial, permanece en este estado durante su ejecución. |
| Parcialmente comprometida: pasa a este estado después de ejecutarse la última instrucción. Después de este estado pasaría al estado de comprometida. |
| Fallida: conmuta a este estado cuando se descubre que no puede continuar su flujo normal de ejecución (ha ocurrido un error en la transacción). |
Abortada: después de retroceder la transacción y devolver la base de datos al estado previo al comienzo de su ejecución (ROLLBACK).
En esta situación el sistema puede:
|
| Comprometida: completada correctamente. |

Para indicar a la base de datos que se trata de una transacción se delimitan las operaciones mediante las instrucciones BEGIN TRANSACTION y END TRANSACTION. La secuencia de operaciones que estén en su interior formará parte de la transacción.
BEGIN...ENDEjemplo: Insertar un nuevo registro en la tabla regions
xxxxxxxxxx31begin2 insert into REGIONS values (5, 'Mordor');3end;Cuando ejecutamos esto, vemos que la base de datos actúa sobre una fila de la tabla regions, pero no actualiza los datos, quedando parcialmente comprometida.
Esto se debe a que debemos realizar un COMMIT de forma explicita para que la transacción quede comprometida.
xxxxxxxxxx41begin2 insert into REGIONS values (5, 'Mordor');3 commit;4end;Ahora, la transacción ha quedado comprometida.
ROLLBACKEl comando ROLLBACK deshace todo lo ejecutado en la transacción hasta el último COMMIT ejecutado.
xxxxxxxxxx41begin2 insert into REGIONS values (5, 'Mordor');3 commit;4end;Se inserta el registro (5, Mordor).
xxxxxxxxxx41begin2 insert into REGIONS values (6, 'Gondor');3 rollback;4end;En este caso, al ejecutar el ROLLBACK, se deshace la transacción hasta el último COMMIT.
SAVEPOINTEl comando SAVEPOINT crea un punto de restauracion de la base de datos dentro de una transacción con un nombre identificador. Si la transacción actual tiene un punto con el mismo nombre, el antiguo se borra y se crea el nuevo.
El comando ROLLBACK TO SAVEPOINT nos devuelve al punto de restauración especificado.
xxxxxxxxxx71begin2 insert into REGIONS values(8, 'Hobbiton');3 savepoint p1;4 update REGIONS set REGION_NAME = 'Unknown' where REGION_ID = 8;5 rollback to savepoint p1;6 commit;7end;Ahora solo se habrá ejecutado la inserción del nuevo registro, pero no la actualización, porque cuando realizamos el rollback to savepoint p1, volvemos a ese punto de restauración.
Para controlar las excepciones podemos usar el comando EXCEPTION WHEN OTHERS, el cual se utiliza para capturar y manejar cualquier tipo de excepción que no haya sido manejada de manera explícita.
xxxxxxxxxx91begin2 savepoint safeZone;3 insert into REGIONS values(9, 'Fangorn');4 insert into REGIONS values(10, 'Isengard');5 insert into REGIONS values(11, 'Rivendell');6
7 exception when others then rollback to safeZone;8 commit;9end;En este caso, como la transacción es correcta, se ejecuta el COMMIT y se compromete la transacción.
xxxxxxxxxx91begin2 savepoint safeZone;3 insert into REGIONS values(12, 'Fangorn');4 insert into REGIONS values(13, 'Isengard');5 insert into REGIONS values(11, 'Rivendell');6
7 exception when others then rollback to safeZone;8 commit;9end;En este otro caso, al insertar los valores (11, 'Rivendell') coincide el ID con el insertado en la transacción anterior, se captura la excepción con EXCEPTION WHEN OTHERS y nos devuelve al punto de restauración creado.
En mysql es ligeramente distinto a ORACLE.
PROCEDUREEn este caso hay que crear un un procedimiento almacenado PROCEDURE, el cual contiene un bloque específico de código que maneja cierta lógica o tarea.
Los procedimientos almacenados son programas que se almacenan en la base de datos y se pueden invocar desde otras partes del código SQL o desde aplicaciones externas.
xxxxxxxxxx41CREATE PROCEDURE EjemploProcedimiento()2BEGIN3 -- Lógica del procedimiento almacenado.4END
CALLLa palabra clave CALL se utiliza para invocar a un procedimiento almacenado.
xxxxxxxxxx11CALL EjemploProcedimiento()
HANDLERHANDLER se refiere comúnmente a un manejador de excepciones.
Un manejador de excepciones se utiliza para gestionar situaciones excepcionales o errores que pueden ocurrir durante la ejecución de un procedimiento o de una serie de instrucciones SQL.
xxxxxxxxxx81CREATE PROCEDURE EjemploProcedimiento()2BEGIN3 -- Se declara el manejador de excepciones y si ocurre un error realizará un rollback.4 DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK;5 6 -- Lógica del procedimiento almacenado.7 8END;
START TRANSACTIONLa sentencia START TRANSACTION se utiliza para iniciar una transacción explícitamente.
xxxxxxxxxx111CREATE PROCEDURE EjemploProcedimiento()2BEGIN3 -- Se declara el control de excepciones y si ocurre un error realiza un rollback.4 DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK;5 -- Se inicia la transacción.6 START TRANSACTION;7 INSERT INTO employees VALUES (500001, '1956-09-05', 'PRIMERO', '', 'M', '1993-10-13');8 INSERT INTO employees VALUES (500002, '1956-09-05', 'SEGUNDO', '', 'M', '1993-10-13');9 INSERT INTO employees VALUES (500003, '1956-09-05', 'TERCERO', '', 'M', '1993-10-13');10 COMMIT;11END;Este procedimiento ejecuta la inserción de tres nuevos empleados en la base de datos.
Ahora imaginemos el siguiente ejemplo:
xxxxxxxxxx111CREATE PROCEDURE EjemploProcedimiento()2BEGIN3 -- Se declara el control de excepciones y si ocurre un error realiza un rollback.4 DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK;5 -- Se inicia la transacción.6 START TRANSACTION;7 INSERT INTO employees VALUES (500001, '1956-09-05', 'PRIMERO', '', 'M', '1993-10-13');8 INSERT INTO employees VALUES (500002, '1956-09-05', 'SEGUNDO', '', 'M', '1993-10-13');9 INSERT INTO employees VALUES (500001, '1956-09-05', 'TERCERO', '', 'M', '1993-10-13');10 COMMIT;11END;En este caso, como el atributo ID coincide, se captura la excepción, la cual ejecuta el ROLLBACK, deshaciendo la transacción.
SAVEPOINTEl comando SAVEPOINT crea un punto de restauracion de la base de datos dentro de una transacción con un nombre identificador. Si la transacción actual tiene un punto con el mismo nombre, el antiguo se borra y se crea el nuevo.
Para indicarle al procedimiento a que punto de restauración queremos dirigirnos en caso de error, lo indicamos en el HANDLER
xxxxxxxxxx121CREATE PROCEDURE EjemploProcedimiento()2BEGIN3 -- Se declara el control de excepciones y si ocurre un error nos devolvera al punto indicado como "p1".4 DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK TO p1;5 -- Se inicia la transacción.6 START TRANSACTION;7 INSERT INTO employees VALUES (500001, '1956-09-05', 'PRIMERO', '', 'M', '1993-10-13');8 SAVEPOINT p1;9 INSERT INTO employees VALUES (500002, '1956-09-05', 'SEGUNDO', '', 'M', '1993-10-13');10 INSERT INTO employees VALUES (500001, '1956-09-05', 'TERCERO', '', 'M', '1993-10-13');11 COMMIT;12END;Ahora solo se habrá ejecutado la inserción de un solo registro, porque como el atributo ID de la tercera inserción coincide, se captura la excepción, la cual ejecuta el ROLLBACK hasta el punto de restauración marcado.
Otro ejemplo de procedimiento:
xxxxxxxxxx71CREATE PROCEDURE insertNewEmployees (V1 INT, V2 DATE, V3 VARCHAR(14), V4 VARCHAR(16), V5 ENUM('M','F'), V6 DATE)2BEGIN3 DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK; -- Si ocurre un error no hace nada.4 START TRANSACTION;5 INSERT INTO employees VALUES (V1, V2, V3, V4, V5, V6);6 COMMIT;7END;En este caso, si al insertar un registro nuevo se produjera un error, no se ejecutaría la transacción.